package com.itheima.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.entity.*;
import com.itheima.mapper.EmpExprMapper;
import com.itheima.mapper.EmpMapper;
import com.itheima.service.EmpLogService;
import com.itheima.service.EmpService;
import com.itheima.utlis.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

//page 页码
//pageSize 每页记录数
@Slf4j
@Service
public class EmpServiceImpl implements EmpService {

    @Autowired
    private EmpMapper empMapper;

    @Autowired
    private EmpExprMapper empExprMapper;


    @Autowired
    private EmpLogService empLogService;
//    @Override
//    public PageBean page(Integer page, Integer pageSize) {
//
////        调用mapper获取总记录
//        Long total = empMapper.count();
////        调用mapper获取分页列表数据
//        Integer start= (page-1)*pageSize;
//        List<Emp> empList = empMapper.page(start, pageSize);
////        封装pagebean对象并返回
//
//        return new PageBean(total,empList);
//    }


    @Override
    public PageBean page(EmpQueryParam  param) {

        //设置分页参数
        PageHelper.startPage(param.getPage(),param.getPageSize()); // 必须紧跟下一条查询语句
        List<Emp> empList = empMapper.list(param);//        调用列表的查询方法
       Page p=(Page) empList;      // 强转page对象继承ArrayList

//        封装pagebean对象并返回

        return new PageBean(p.getTotal(),p.getResult());
    }

    @Transactional(rollbackFor = Exception.class)  // 开启事务    //rollbackFor指定处理所有异常
    @Override
    public void save(Emp emp) throws Exception {

        try {
            //1调用mapper保存员工基本信息到emp表
            //补充缺失字段
            emp.setPassword("123456");
            emp.setCreateTime(LocalDateTime.now());
            emp.setUpdateTime(LocalDateTime.now());

            empMapper.insert(emp);

            Integer id = emp.getId();
            log.info("保存员工信息成功，员工id为：{}",id);


            //模拟异常
            // int i=10/0;
            //模拟非运行时异常
//            if(true) {
//                throw new Exception("出错了");
//            }


            //2调用mapper保存员工工作经历信息到emp_expr表
            List<EmpExpr> exprList = emp.getExprList();

            //2.1关联员工id
            if(!CollectionUtils.isEmpty(exprList))
            {
                exprList.forEach((expr) ->{
                    expr.setEmpId(id);
                });
            }

//        批量保存员工经历
            empExprMapper.insertBatch(exprList);
        } finally {
            //无论是否成功能执行
            EmpLog empLog =new EmpLog();
            empLog.setOperateTime(LocalDateTime.now());
            empLog.setInfo("保存员工信息"+emp);
            empLogService.insertLog(empLog);



        }

    }

    @Transactional   //开启事务（涉及多张表）
    @Override
    public void delete(List<Integer> ids) {
         //1.删除员工的基本信息数据emp表

        empMapper.deleteBatch(ids);

        //2.删除员工的经历信息数据emp_expr
        empExprMapper.deleteBatch(ids);
    }

    @Override
    public Emp getById(Integer id) {
        //方式一
        //return empMapper.getById(id);

        //方式二
//       1. 查询员工基本信息并封装到emp对象
        Emp emp=empMapper.getById2(id);
//        2.查询员工经历信息并封装到emp对象
        List<EmpExpr> empExprList =empExprMapper.getByEmpId(id);
        emp.setExprList(empExprList);
//        3.返回emp对象
        return emp;
    }

    @Transactional
    @Override
    public void update(Emp emp) {

        //1.修改员工基本信息emp
        //1.1补充基础属性，更新时间
        emp.setUpdateTime(LocalDateTime.now());
        empMapper.update(emp);

        //2.修改员工经历信息emp_expr
        //先删后增
        empExprMapper.deleteByEmpId(emp.getId());
        List<EmpExpr> exprList = emp.getExprList();

        if(!CollectionUtils.isEmpty(exprList)) {
            //关联员工id
            exprList.forEach((expr) -> {
                expr.setEmpId(emp.getId());
            });
            empExprMapper.insertBatch(exprList);
        }

    }

    @Override
    public EmpLoginInfo login(Emp emp) {
//        1.调用mapper查询员工
        Emp empDB = empMapper.selectUsernameAndPassword(emp);
//        2.用户账号密码是否正确
        if(empDB!=null)
        {

            //完成登录逻辑，登录成功需要生成jwt令牌\


            //自定义有效载荷
            Map<String, Object> claims=new HashMap<>();
            claims.put("id",empDB.getId());
            claims.put("username",empDB.getUsername());

            //调用Jwt工具类生成jwt令牌
            String jwt = JwtUtils.generateJwt(claims);
            //3.如果查到数据，就构造EmpLoginInfo对象并返回
            return new EmpLoginInfo(empDB.getId(), empDB.getUsername(), empDB.getName(),jwt);

        }


        return null;
    }


}
